#pragma once

class CAppConfig;
class CUIWndManager;
class CCloudManager;
class CPluginManager;

class CGaojieDriveApp
{
public:
	CGaojieDriveApp(HINSTANCE hInstance);
	~CGaojieDriveApp();

	bool Init(LPCWSTR lpCmdLine);
	void Exit();

	HINSTANCE GetInstance() const { return m_hInstance; }
	const std::unique_ptr<CAppConfig>& GetAppConfig() const { return m_pAppConfig; }
	const std::unique_ptr<CUIWndManager>& GetUIWndManager() const { return m_pUIWndManager; }
	const std::unique_ptr<CCloudManager>& GetCloudManager() const { return m_pCloudManager; }
	const std::unique_ptr<CPluginManager>& GetPluginManager() const { return m_pPluginManager; }

private:
	HINSTANCE m_hInstance;
	std::unique_ptr<CAppConfig> m_pAppConfig;
	std::unique_ptr<CUIWndManager> m_pUIWndManager;
	std::unique_ptr<CCloudManager> m_pCloudManager;
	std::unique_ptr<CPluginManager> m_pPluginManager;
};

const std::unique_ptr<CGaojieDriveApp>& GetApp();
